package models

import (
	"context"
	"gin_study_blog/common"
	"github.com/sirupsen/logrus"
)

// FullTextModel 全文索引
type FullTextModel struct {
	ID    string `json:"id" structs:"id"`       // es的id
	Title string `json:"title" structs:"title"` // 文章标题
	Key   string `json:"key"`                   // 文章 article_index 中的 id
	Slug  string `json:"slug" structs:"slug"`   // 文章标题的跳转地址
	Body  string `json:"body" structs:"body"`   // 文章内容
}

// Index 文章管理索引
func (FullTextModel) Index() string {
	return "full_text_index"
}

func (FullTextModel) Mapping() string {
	return `
{
	"settings": {
		"index": {
			"max_result_window": "100000"
		}
	},
	"mappings": {
		"properties": {
			"key": {
				"type": "keyword"
			},
			"title": {
				"type": "text"
			},
			"slug": {
				"type": "keyword"
			},
			"body": {
				"type": "text"
			}
		}
	}
}
`
}

// IndexExists 检查是否存在 索引
func (a FullTextModel) IndexExists() bool {
	// 查索引是否存在
	exists, err := common.EsClient.IndexExists(a.Index()).Do(context.Background())
	if err != nil {
		logrus.Error(err.Error())
		return exists
	}
	return exists
}

// CreateIndex 创建索引
func (a FullTextModel) CreateIndex() error {
	if a.IndexExists() {
		// 存在索引, 就删除索引, 进行添加
		err := a.DeleteIndex()
		if err != nil {
			logrus.Error(err.Error())
			return err
		}
	}
	// 不存在索引, 直接进行添加
	createIndex, err := common.EsClient.CreateIndex(a.Index()).BodyString(a.Mapping()).Do(context.Background())
	if err != nil {
		logrus.Error("创建索引失败")
		logrus.Error(err.Error())
		return err
	}
	if !createIndex.Acknowledged {
		logrus.Error("创建失败")
		return err
	}
	logrus.Infof("索引 %s 创建成功", a.Index())
	return nil
}

// DeleteIndex 删除索引
func (a FullTextModel) DeleteIndex() error {
	deleteIndex, err := common.EsClient.DeleteIndex(a.Index()).Do(context.Background())
	if err != nil {
		logrus.Error("索引删除失败")
		logrus.Error(err.Error())
		return err
	}
	if !deleteIndex.Acknowledged {
		logrus.Error("删除失败")
		return err
	}
	return nil
}
